# 权限管理装饰器和工具函数
from functools import wraps
from flask import abort, flash, redirect, url_for, request, jsonify
from flask_login import current_user

def role_required(*role_names):
    """
    角色权限装饰器
    确保当前用户拥有指定的角色之一
    """
    def decorator(f):
        @wraps(f)
        def decorated_function(*args, **kwargs):
            if not current_user.is_authenticated:
                # 如果是AJAX请求，返回JSON错误
                if request.headers.get('X-Requested-With') == 'XMLHttpRequest':
                    return jsonify({
                        'success': False,
                        'message': '需要登录才能访问此页面',
                        'login_required': True
                    }), 401
                
                flash('请先登录', 'warning')
                return redirect(url_for('auth.login', next=request.url))
            
            if not any(current_user.has_role(role) for role in role_names):
                # 如果是AJAX请求，返回JSON错误
                if request.headers.get('X-Requested-With') == 'XMLHttpRequest':
                    return jsonify({
                        'success': False,
                        'message': '您没有权限访问此页面'
                    }), 403
                
                flash('您没有权限访问此页面', 'danger')
                abort(403)
            
            return f(*args, **kwargs)
        return decorated_function
    return decorator

def permission_required(*permission_names):
    """
    权限装饰器
    确保当前用户拥有指定的权限之一
    """
    def decorator(f):
        @wraps(f)
        def decorated_function(*args, **kwargs):
            if not current_user.is_authenticated:
                # 如果是AJAX请求，返回JSON错误
                if request.headers.get('X-Requested-With') == 'XMLHttpRequest':
                    return jsonify({
                        'success': False,
                        'message': '需要登录才能访问此页面',
                        'login_required': True
                    }), 401
                
                flash('请先登录', 'warning')
                return redirect(url_for('auth.login', next=request.url))
            
            if not any(current_user.has_permission(permission) for permission in permission_names):
                # 如果是AJAX请求，返回JSON错误
                if request.headers.get('X-Requested-With') == 'XMLHttpRequest':
                    return jsonify({
                        'success': False,
                        'message': '您没有权限执行此操作'
                    }), 403
                
                flash('您没有权限执行此操作', 'danger')
                abort(403)
            
            return f(*args, **kwargs)
        return decorated_function
    return decorator

def admin_required(f):
    """
    管理员权限装饰器
    确保当前用户是管理员
    """
    @wraps(f)
    def decorated_function(*args, **kwargs):
        if not current_user.is_authenticated:
            # 如果是AJAX请求，返回JSON错误
            if request.headers.get('X-Requested-With') == 'XMLHttpRequest':
                return jsonify({
                    'success': False,
                    'message': '需要登录才能访问此页面',
                    'login_required': True
                }), 401
            
            flash('请先登录', 'warning')
            return redirect(url_for('.auth.login', next=request.url))
        
        if not current_user.is_admin and not current_user.has_role('admin'):
            # 如果是AJAX请求，返回JSON错误
            if request.headers.get('X-Requested-With') == 'XMLHttpRequest':
                return jsonify({
                    'success': False,
                    'message': '需要管理员权限'
                }), 403
            
            flash('需要管理员权限', 'danger')
            abort(403)
        
        return f(*args, **kwargs)
    return decorated_function

def self_or_admin_required(f):
    """
    自己或管理员权限装饰器
    确保当前用户是管理员或者是资源所有者
    需要在路由参数中包含user_id
    """
    @wraps(f)
    def decorated_function(*args, **kwargs):
        if not current_user.is_authenticated:
            # 如果是AJAX请求，返回JSON错误
            if request.headers.get('X-Requested-With') == 'XMLHttpRequest':
                return jsonify({
                    'success': False,
                    'message': '需要登录才能访问此页面',
                    'login_required': True
                }), 401
            
            flash('请先登录', 'warning')
            return redirect(url_for('auth.login', next=request.url))
        
        # 检查是否是管理员或者是资源所有者
        user_id = kwargs.get('user_id')
        if user_id:
            try:
                user_id = int(user_id)
                is_owner = current_user.id == user_id
            except (ValueError, TypeError):
                is_owner = False
        else:
            is_owner = False
        
        if not (current_user.is_admin or current_user.has_role('admin') or is_owner):
            # 如果是AJAX请求，返回JSON错误
            if request.headers.get('X-Requested-With') == 'XMLHttpRequest':
                return jsonify({
                    'success': False,
                    'message': '您没有权限访问此资源'
                }), 403
            
            flash('您没有权限访问此资源', 'danger')
            abort(403)
        
        return f(*args, **kwargs)
    return decorated_function

def check_permission(permission_name):
    """
    检查当前用户是否有指定权限
    返回布尔值，不重定向
    """
    if not current_user.is_authenticated:
        return False
    
    return current_user.has_permission(permission_name)

def check_role(role_name):
    """
    检查当前用户是否有指定角色
    返回布尔值，不重定向
    """
    if not current_user.is_authenticated:
        return False
    
    return current_user.has_role(role_name)